package com.lingkang.ngfile.service.impl;

import com.lingkang.ngfile.dto.ResponseResult;
import com.lingkang.ngfile.entity.NgFile;
import com.lingkang.ngfile.mapper.NgFileMapper;
import com.lingkang.ngfile.service.FileService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author linke
 * @date 2020-02-08 下午 21:47
 * @description
 */
@Service
public class FileServiceImpl implements FileService {
    @Value("${server.domain}")
    private String domain;
    @Value("${server.file.public}")
    private String filePublic;
    @Value("${server.file.publicUrl}")
    private String filePublicUrl;
    @Value("${server.file.private}")
    private String filePrivate;
    @Value("${server.file.privateUrl}")
    private String filePrivateUrl;

    @Autowired
    private NgFileMapper ngFileMapper;

    /**
     * 注意使用同步锁，防止多个同时上传造成 ng_name 一致
     */
    @Override
    public synchronized ResponseResult publicUp(MultipartFile[] files, String upIP) throws IOException {
        //使用锁 公开的资源ng_name为单数
        //首先检查文件格式
        for (int i = 0; i < files.length; i++) {
            if (files[i].getSize() < 1) {
                return new ResponseResult(ResponseResult.StateCode.ISEMPTY,
                        String.format("存在空文件，第%d个文件", i + 1));
            }
        }

        //执行本地保存
        Integer ngName = ngFileMapper.getFileMaxKey();//获取最后的key
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");//添加上年月
        String yearMonth = sdf.format(new Date()) + "/"; //添加上 /
        File dir = new File(filePublic + yearMonth);
        if (!dir.isDirectory()) {
            //判断文件夹是否存在，不存在，先创建
            dir.mkdirs();
        }
        List<String> resURL = new ArrayList<>(); //用于返回url结果到前端
        for (MultipartFile file : files) {
            NgFile ngFile = new NgFile();
            //后缀
            String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
            if (ngName % 2 == 0) { //双数
                ngName = ngName + 2;
                ngFile.setNgName(ngName);
            } else { //单数
                ngName = ngName + 1;
                ngFile.setNgName(ngName);
            }
            //执行保存  服务器路径+年月文件夹+名称(key)+后缀
            file.transferTo(Paths.get(filePublic + yearMonth + ngName + suffix));

            //添加上浏览器带过来的名字，注意长度
            ngFile.setUpName(file.getOriginalFilename().length() > 39 ?
                    file.getOriginalFilename().substring(0, 39) : file.getOriginalFilename());
            ngFile.setCreateTime(new Date());
            ngFile.setFileType("public");
            ngFile.setSuffix(suffix);
            ngFile.setStatus(1);
            //记录下上传者的ip
            ngFile.setUpIp(upIP);
            // url路径+年月+key+后缀
            ngFile.setUrl(filePublicUrl + yearMonth + ngName + suffix);
            //写入数据库
            ngFileMapper.insertSelective(ngFile);
            resURL.add(domain + ngFile.getUrl());
        }

        return new ResponseResult(ResponseResult.StateCode.OK,
                "上传成功", resURL);
    }
}
